#include <iostream>
#include <fstream>
using namespace std;
#include "network.h"

double **create_other(double *para);

NETWORK::NETWORK() {
    N=0;
    MATRIX=NULL;
    LINK=NULL;
    TAG=-1;
    FEATURE=NULL;
    }


NETWORK::~NETWORK() {
    if ( N==0 ) return;
    for ( int i=0; i<N; i++) {
        delete MATRIX[i];
        delete LINK[i];
        }
    delete MATRIX ;
    delete LINK;
    delete FEATURE;

    NETWORK();
    }

void NETWORK::CREATE(char tag , double *para) {
    switch (tag) {
        case 'o':
            N=(int)(para[0]*para[1]);
            TAG=1;
            MATRIX=create_other(para);
            FEATURE=new double[N];
            for(int j=0; j<N; j++) FEATURE[j]=5+(j%(int)para[1])*0.1;
            break;
        }

    if (TAG<2) { //对于无向网络，一律将上三角矩阵扩充
        int i,j;
        for (i=1; i<N; i++)
            for (j=0; j<i; j++)
                MATRIX[i][j]=MATRIX[j][i];
        }

    LINK=new int*[N];
    for (int i=0; i<N; i++) { // 根据邻接矩阵创建邻接表
        LINK[i]=new int[N];
        LINK[i][0]=0;
        for(int j=0; j<N; j++)
            if (MATRIX[i][j]!=0) LINK[i][++LINK[i][0]] =j; // 第0列存放邻居个数，后面是邻居编号
        }
    }
////////////////////////////////////////////////////////////////////////


double **create_other(double *para) {
    int MM=(int)para[0],NN=(int)para[1];  // MM*NN = (1行内毛细胞+3行外毛细胞)*多少列细胞
    int N=MM*NN;
    double **MAT=new double*[N];

    int i,j,n;
    for (n=0; n<N; n++) MAT[n]=new double[N];
    for (i=0; i<N; i++) {
        MAT[i][i]=0;
        for (j=i+1; j<N; j++) {
            if (i<NN) { //内毛细胞
                if(j==i+1 && j<NN) MAT[i][j]=para[2]; // 相邻内毛细胞之间正作用
                else if(!((j-i)%NN)) MAT[i][j]=-para[2]; // 内毛细胞和同列外毛细胞之间反作用
                else MAT[i][j]=0; //否则没有相互作用
                }
            else if(!((j-i)%NN) || j==i+1) MAT[i][j]=para[2];  // 相邻或同列外毛细胞之间正作用
            else MAT[i][j]=0;
            }
        }

    return MAT;
    }
////////////////////////////////////////////////////////////////////////


void NETWORK::print_network() {
    for(int i=0; i<N; i++) {
        for (int j=0; j<N; j++)
            cout<<std::right<<MATRIX[i][j]<<"  ";
        cout<<endl;
        }
    for(int i=0; i<N; i++) {
        for (int j=0; j<N; j++)
            cout<<std::right<<LINK[i][j]<<"  ";
        cout<<endl;
        }
    }


void NETWORK::print_network(ofstream &File) {

    for(int i=0; i<N; i++) {
        for (int j=0; j<N; j++)
            File<<std::right<<MATRIX[i][j]<<";";
        File<<endl;
        }
    File<<endl<<endl;
    for(int i=0; i<N; i++) {
        for (int j=0; j<N; j++)
            File<<std::right<<LINK[i][j]<<";";
        File<<endl;
        }

    }
